#!/usr/bin/env ruby
# frozen_string_literal: true

require "pathname"
require "json"

Dir.chdir("#{__dir__}/..") # rubocop:disable Discourse/NoChdir because this is not part of the app

CORE_NAMESPACES = {
  "discourse/*" => ["app/assets/javascripts/discourse/app"],
  "discourse/tests/*" => ["app/assets/javascripts/discourse/tests"],
  "admin/*" => ["app/assets/javascripts/admin/addon"],
  "pretty-text/*" => ["app/assets/javascripts/pretty-text/addon"],
  "select-kit/*" => ["app/assets/javascripts/select-kit/addon"],
  "float-kit/*" => ["app/assets/javascripts/float-kit/addon"],
  "truth-helpers/*" => ["app/assets/javascripts/truth-helpers/addon"],
  "dialog-holder/*" => ["app/assets/javascripts/dialog-holder/addon"],
}

def relative(from, to)
  relative_path = Pathname.new(to).relative_path_from(from).to_s
  relative_path = "./#{relative_path}" if !relative_path.start_with?(".")
  relative_path
end

def write_config(package_dir, extras: {})
  package_dir = Pathname.new(package_dir)
  namespaces = { **CORE_NAMESPACES, **extras }
  config = {
    "compilerOptions" => {
      "target" => "es2021",
      "module" => "esnext",
      "moduleResolution" => "bundler",
      "experimentalDecorators" => true,
      "allowJs" => true,
      "paths" => {
        **namespaces
          .map { |ns, paths| [ns, paths.map { |p| "#{relative(package_dir, p)}/*" }] }
          .to_h,
      },
    },
    "include" => namespaces.flat_map { |ns, paths| paths.map { |p| relative(package_dir, p) } },
    "exclude" => [
      "app/assets/javascripts/discourse/tests/unit/utils/decorators-test.js", # Native class decorators - unsupported by ts/glint
      "app/assets/javascripts/discourse/tests/integration/component-templates-test.gjs", # hbs`` tagged templates - https://github.com/typed-ember/glint/issues/705
      "**/*.hbs",
    ],
    "glint" => {
      "environment" => %w[ember-loose ember-template-imports],
      "checkStandaloneTemplates" => false,
    },
  }

  output = <<~JSON
    // This file was generated by script/build_jsconfig.rb
    #{JSON.pretty_generate(config)}
  JSON

  File.write("#{package_dir}/jsconfig.json", output)
end

plugin_configs =
  `git ls-files plugins/*/plugin.rb`.lines
    .map { File.dirname(_1) }
    .map do |path|
      ["discourse/#{path}/*", ["#{path}/assets/javascripts", "#{path}/test/javascripts"]]
    end
    .to_h

theme_configs =
  `git ls-files themes/*/about.json`.lines
    .map { File.dirname(_1) }
    .map { |path| ["discourse/#{path}/*", ["#{path}/javascripts", "#{path}/test"]] }
    .to_h

write_config ".", extras: plugin_configs.merge(theme_configs)
